home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / a_utils / lgrammar / src / xui.c < prev   
C/C++ Source or Header  |  1993-09-09  |  50KB  |  1,765 lines

  1. /*************************************************************************/
  2. /*
  3.  *
  4.  *  Filename:  xui.c
  5.  *
  6.  */
  7.  
  8. #include "grammar.h"
  9. #include <sys/param.h>
  10.  
  11. #include <malloc.h>
  12. #include <math.h>
  13. #include <stdio.h>
  14. #include <ctype.h>
  15.  
  16. #include <X11/Intrinsic.h>
  17. #include <X11/StringDefs.h>
  18. #include <X11/Shell.h>
  19.  
  20.  
  21.  
  22. /* Include files required for widgets used in this file */
  23.  
  24. #include <X11/Xaw/AsciiText.h>
  25. #include <X11/Xaw/Box.h>
  26. #include <X11/Xaw/Cardinals.h>
  27. #include <X11/Xaw/Command.h>
  28. #include <X11/Xaw/Dialog.h>
  29. #include <X11/Xaw/Form.h>
  30. #include <X11/Xaw/Label.h>
  31. #include <X11/Xaw/List.h>
  32. #include <X11/Xaw/Paned.h>
  33. #include <X11/Xaw/Text.h>
  34. #include <X11/Xaw/Viewport.h>
  35.  
  36.  
  37. /* aus load.c */
  38.  
  39. extern void Load();
  40. extern void ClickList();
  41. extern void LoadOk();
  42. extern void LoadCancel();
  43.  
  44.  
  45. /* aus save.c */
  46.  
  47. extern void SaveOReturnOk();
  48. extern void SaveObj();
  49.  
  50. extern Widget fileinput;
  51.  
  52.  
  53. /* aus color.c */
  54.  
  55. extern char  *col_pal_name;
  56. extern XColor owncolor[NOC];
  57.  
  58. extern void     Color();
  59. extern void     init_color();
  60. extern void     change_color();
  61.  
  62.  
  63. /* aus functions.c */
  64.  
  65. extern REGELN  *init_grammar();
  66. extern char    *word_to_string();
  67. extern int      test_dimens();
  68. extern SYMBOLE *delete_wordlist();
  69. extern REGELN  *delete_grammarlist();
  70. extern int      klammerung();
  71. extern int      test_wk();
  72.  
  73.  
  74. /* aus grammar.c */
  75.  
  76. extern int     klammern_pruefen();
  77. extern void    init_word();
  78. extern void    ableitung_wort();
  79. extern void    ableitung_symbol();
  80.  
  81.  
  82. /* aus turtle.c */
  83.  
  84. extern void    init_drawing();
  85. extern void    turtle_2D();
  86. extern void    turtle_3D();
  87.  
  88. extern Display  *display;
  89. extern int       screen;
  90. extern GC        draw_gc;
  91. extern Pixmap    draw_pixmap;
  92. extern Dimension draw_width, draw_height;
  93.  
  94.  
  95. /* functions in xui.c */
  96.  
  97. void RestorePicture();
  98. void Dummy();
  99. void syntax();
  100. void Help();
  101. void HelpOk();
  102. void G3D();
  103. void Proj();
  104. void ProjOk();
  105. void ProjCancel();
  106. void GOk();
  107. void GStop();
  108. void display_deriv();
  109. void display_word();
  110. void Fehler();
  111. void NextDeriv();
  112. void PrevDeriv();
  113. void SingleSymbol();
  114. void ContinueSymbol();
  115. void Save();
  116. void SaveSReturnOk();
  117. void SaveOk();
  118. void SaveCancel();
  119. void SaveImage();
  120. void Quit();
  121.  
  122. void save_settings_to_file();
  123.  
  124.  
  125. /* global variables */
  126.  
  127. REGELN *grammar = NULL;
  128.  
  129. SYMBOLE *word = NULL,
  130.         *current_symbol = NULL;
  131.  
  132. Boolean anhalten = FALSE; /* used once here */
  133.  
  134. String *str = NULL; /*enthaelt abgeleitete Symbole fuer Anzeige in wlist */
  135.  
  136. int count_deriv;  /* zaehlt die Ableitungen */
  137.  
  138. int dimens; /* 2D- oder 3D-Symbole in Grammatik */
  139.  
  140. TURTLE_VALUES *turtle; /* Struktur, die Turtle-Eingabewerte enthaelt */
  141.  
  142. int persp_x0, persp_y0,  /* Koordinatenursprung der Bildkoordinaten */
  143.     persp_a;             /* Zentrum der perspektivischen Projektion */
  144.  
  145.  
  146. int color_index; /* used once here */
  147.  
  148.  
  149.  
  150. Widget topLevel;
  151.  
  152. Widget drawing; /* Widget zur Ausgabe der erstellten Bilder */
  153.  
  154. Widget wlist;
  155. Widget wderiv;
  156.  
  157. Widget g_posx, g_posy, g_posz,
  158.        g_angle,
  159.        g_length,
  160.        g_scale,
  161.        g_proj,
  162.        g_3d,
  163.        glabel,
  164.        gram;
  165.  
  166. Widget g_headx, g_heady, g_headz,
  167.        g_leftx, g_lefty, g_leftz,
  168.        g_upx, g_upy, g_upz;
  169.  
  170. Widget proj_x0, proj_y0, proj_a;
  171.  
  172. Widget g_stop, g_ok;
  173.  
  174. Widget nextderiv, prevderiv,
  175.        singlesymbol, continuesymbol;
  176.  
  177. Widget save;
  178. Widget savesett;
  179.  
  180.  
  181. XtAppContext app_context;
  182.  
  183. static String fallback_resources[] = {
  184.  "*savesett.value.translations: #override \\n <Key>Return:SaveSReturnOk()",
  185.  "*fileinput.value.translations:#override \\n <Key>Return:SaveOReturnOk()",
  186.  NULL
  187. };
  188.  
  189. XtActionsRec actionTable[] = {
  190.     {"SaveSReturnOk", SaveSReturnOk},
  191.     {"SaveOReturnOk", SaveOReturnOk},
  192.  NULL
  193. };
  194.  
  195. double CO[361], SI[361]; /* just calculated here, but not used */
  196.  
  197. /*************************************************************************/
  198. void main(argc, argv)
  199. int argc;
  200. char **argv;
  201. {
  202.    Widget paned,       /* 1.Widget, zur Ein-/Ausgabe der Daten */ 
  203.           popup;       /* 2.Widget, enthaelt Widget drawing */
  204.  
  205.    Widget wform,       /* Widget zur Ausgabe des aktuellen Wortes */
  206.           wlabel,
  207.           wview,
  208.           wderivlabel;  
  209.  
  210.    Widget gform,       /* Widget zur Ein-/Ausgabe der Grammatik */
  211.           gpform,
  212.           gtform,
  213.           gbform,
  214.           g_color,
  215.           g_help;
  216.  
  217.    Widget buttonform,  /* Widget, welches die Buttons enthaelt */
  218.           quit,
  219.           load;
  220.  
  221.    static XtActionsRec neu_wlist[] = { {"dummy", Dummy}, };
  222.  
  223.  
  224.    int i;             /* Schleifenvariable */
  225.    double winkel;     /* Winkel im Bogenmass */
  226.  
  227.   /**************************************************************/
  228.    topLevel = XtVaAppInitialize(
  229.            &app_context,             /* Application context */
  230.            "LGrammar",               /* Application class */
  231.            NULL, 0,                  /* command line option list */
  232.            &argc, argv,              /* command line args */
  233.            fallback_resources,       /* appl-defaults */
  234.            NULL);                    /* terminate varargs list */
  235.  
  236.    XtAppAddActions(app_context, actionTable, XtNumber(actionTable));
  237.  
  238.    if (argc != 1) syntax(app_context, argv[0]);
  239.  
  240.    paned = XtVaCreateManagedWidget(
  241.            "paned",             /* arbitrary widget name */
  242.            panedWidgetClass,    /* widget class from Paned.h */ 
  243.            topLevel,            /* parent widget */
  244.            NULL);               /* terminate varargs list */ 
  245.  
  246.    popup = XtVaCreatePopupShell(
  247.            "lgrammar_drawing",  /* arbitrary widget name */
  248.            topLevelShellWidgetClass,   /* Widget class */
  249.            topLevel,            /* parent widget */
  250.            NULL);               /* terminat varargs list */
  251.  
  252.    drawing = XtVaCreateManagedWidget(       
  253.            "drawing",           /* widget name */
  254.            widgetClass,         /* widget class */
  255.            popup,               /* parent widget */
  256.            NULL);               /* terminate varargs list */
  257.  
  258.    XtAddEventHandler(
  259.            drawing,             /* widget name */
  260.            ExposureMask,        /* event_mask */
  261.            FALSE,               /* nonmaskable */
  262.            RestorePicture,      /* handler */
  263.            NULL);               /* client_data */
  264.  
  265.   /**************************************************************/
  266.    wform = XtVaCreateManagedWidget(       
  267.            "wform",             /* widget name */
  268.            formWidgetClass,     /* widget class from Form.h */
  269.            paned,               /* parent widget */
  270.            NULL);               /* terminate varargs list */
  271.  
  272.    wlabel = XtVaCreateManagedWidget(
  273.            "wlabel",            /* widget name */
  274.            labelWidgetClass,    /* widget class from Label.h */
  275.            wform,               /* parent widget */
  276.            NULL);               /* terminate varargs list */
  277.  
  278.    wview = XtVaCreateManagedWidget(
  279.            "wview",             /* widget name */
  280.            viewportWidgetClass, /* widget class from Viewport.h */
  281.            wform,               /* parent widget */
  282.            NULL);               /* terminate varargs list */ 
  283.  
  284.    wlist = XtVaCreateManagedWidget(
  285.            "wlist",             /* widget name */
  286.            listWidgetClass,     /* widget class from List.h */
  287.            wview,               /* parent widget */
  288.            NULL);               /* terminate varags list */
  289.  
  290.    /* wlist erhaelt neue Funktion ueber translation table */
  291.    XtAppAddActions(app_context, neu_wlist, XtNumber(neu_wlist));
  292.  
  293.    /* wlist soll zu Beginn leer sein */
  294.    str = (String *) XtRealloc((char *)str, sizeof(String) * 1);
  295.    if (str == NULL)
  296.    {
  297.      fprintf(stderr, "Kein Speicher mehr frei!\n");
  298.      fprintf(stderr, "XtRealloc-Aufruf in main\n");
  299.      exit(1);
  300.    }
  301.    str[0] = XtNewString(" ");
  302.    XawListChange(wlist, str, 1, 0, TRUE);
  303.  
  304.    wderivlabel = XtVaCreateManagedWidget(
  305.            "wderivlabel",       /* widget name */
  306.            labelWidgetClass,    /* widget class from Label.h */
  307.            wform,               /* parent widget */
  308.            NULL);               /* terminate varargs list */           
  309.  
  310.    wderiv = XtVaCreateManagedWidget(
  311.            "wderiv",            /* widget name */
  312.            labelWidgetClass,    /* widget class from Label.h */
  313.            wform,               /* parent widget */
  314.            NULL);               /* terminate varargs list */
  315.  
  316.   /**************************************************************/
  317.  
  318.    gform = XtVaCreateManagedWidget(       
  319.            "gform",             /* widget name */
  320.            formWidgetClass,     /* widget class from Form.h */
  321.            paned,               /* parent widget */
  322.            NULL);               /* terminate varargs list */
  323.  
  324.    gpform = XtVaCreateManagedWidget(
  325.            "gpform",            /* widget name */
  326.            formWidgetClass,     /* widgetClass from Form.h */
  327.            gform,               /* parent widget */
  328.            NULL);
  329.  
  330.    g_posx = XtVaCreateManagedWidget(
  331.            "g_posx",            /* widget name */
  332.            dialogWidgetClass,   /* widget class from Dialog.h */
  333.            gpform,              /* parent widget */
  334.            NULL);               /* terminate varargs list */  
  335.  
  336.    g_posy = XtVaCreateManagedWidget(
  337.            "g_posy",            /* widget name */
  338.            dialogWidgetClass,   /* widget class from Dialog.h */
  339.            gpform,              /* parent widget */
  340.            NULL);               /* terminate varargs list */  
  341.  
  342.    g_posz = XtVaCreateManagedWidget(
  343.            "g_posz",            /* widget name */
  344.            dialogWidgetClass,   /* widget class from Dialog.h */
  345.            gpform,              /* parent widget */
  346.            NULL);               /* terminate varargs list */  
  347.    XtSetSensitive(g_posz, FALSE);
  348.  
  349.    g_angle = XtVaCreateManagedWidget(
  350.            "g_angle",           /* widget name */
  351.            dialogWidgetClass,   /* widget class from Dialog.h */
  352.            gpform,              /* parent widget */
  353.            NULL);               /* terminate varargs list */  
  354.  
  355.    g_length = XtVaCreateManagedWidget(
  356.            "g_length",          /* widget name */
  357.            dialogWidgetClass,   /* widget class from Dialog.h */
  358.            gpform,              /* parent widget */
  359.            NULL);               /* terminate varargs list */  
  360.  
  361.    g_scale = XtVaCreateManagedWidget(
  362.            "g_scale",           /* widget name */
  363.            dialogWidgetClass,   /* widget class from Dialog.h */
  364.            gpform,              /* parent widget */
  365.            NULL);               /* terminate varargs list */
  366.  
  367.    gtform = XtVaCreateManagedWidget(       
  368.            "gtform",            /* widget name */
  369.            formWidgetClass,     /* widget class from Form.h*/
  370.            gform,               /* parent widget */
  371.            NULL);               /* terminate varargs list */
  372.  
  373.  
  374.    g_headx = XtVaCreateManagedWidget(
  375.            "g_headx",           /* widget name */
  376.            dialogWidgetClass,   /* widget class from Dialog.h */
  377.            gtform,              /* parent widget */
  378.            NULL);               /* terminate varargs list */  
  379.  
  380.    g_heady = XtVaCreateManagedWidget(
  381.            "g_heady",           /* widget name */
  382.            dialogWidgetClass,   /* widget class from Dialog.h */
  383.            gtform,              /* parent widget */
  384.            NULL);               /* terminate varargs list */
  385.  
  386.    g_headz = XtVaCreateManagedWidget(
  387.            "g_headz",           /* widget name */
  388.            dialogWidgetClass,   /* widget class from Dialog.h */
  389.            gtform,              /* parent widget */
  390.            NULL);               /* terminate varargs list */  
  391.    XtSetSensitive(g_headz, FALSE);
  392.  
  393.    g_leftx = XtVaCreateManagedWidget(
  394.            "g_leftx",           /* widget name */
  395.            dialogWidgetClass,   /* widget class from Dialog.h */
  396.            gtform,              /* parent widget */
  397.            NULL);               /* terminate varargs list */  
  398.    XtSetSensitive(g_leftx, FALSE);
  399.  
  400.    g_lefty = XtVaCreateManagedWidget(
  401.            "g_lefty",           /* widget name */
  402.            dialogWidgetClass,   /* widget class from Dialog.h */
  403.            gtform,              /* parent widget */
  404.            NULL);               /* terminate varargs list */  
  405.    XtSetSensitive(g_lefty, FALSE);
  406.  
  407.    g_leftz = XtVaCreateManagedWidget(
  408.            "g_leftz",           /* widget name */
  409.            dialogWidgetClass,   /* widget class from Dialog.h */
  410.            gtform,              /* parent widget */
  411.            NULL);               /* terminate varargs list */  
  412.    XtSetSensitive(g_leftz, FALSE);
  413.  
  414.    g_upx = XtVaCreateManagedWidget(
  415.            "g_upx",             /* widget name */
  416.            dialogWidgetClass,   /* widget class from Dialog.h */
  417.            gtform,              /* parent widget */
  418.            NULL);               /* terminate varargs list */  
  419.    XtSetSensitive(g_upx, FALSE);
  420.  
  421.    g_upy = XtVaCreateManagedWidget(
  422.            "g_upy",             /* widget name */
  423.            dialogWidgetClass,   /* widget class from Dialog.h */
  424.            gtform,              /* parent widget */
  425.            NULL);               /* terminate varargs list */  
  426.    XtSetSensitive(g_upy, FALSE);
  427.  
  428.    g_upz = XtVaCreateManagedWidget(
  429.            "g_upz",             /* widget name */
  430.            dialogWidgetClass,   /* widget class from Dialog.h */
  431.            gtform,              /* parent widget */
  432.            NULL);               /* terminate varargs list */  
  433.    XtSetSensitive(g_upz, FALSE);
  434.  
  435.    gbform = XtVaCreateManagedWidget(       
  436.            "gbform",            /* widget name */
  437.            formWidgetClass,     /* widget class from Form.h*/
  438.            gform,               /* parent widget */
  439.            NULL);               /* terminate varargs list */
  440.  
  441.    g_3d = XtVaCreateManagedWidget(
  442.            "g_3d",              /* widget name */
  443.            commandWidgetClass,  /* widget class from Command.h */
  444.            gbform,              /* parent widget */
  445.            NULL);               /* terminate varargs list */
  446.    XtAddCallback(g_3d, XtNcallback, G3D, NULL);
  447.  
  448.    g_proj = XtVaCreateManagedWidget(
  449.            "g_proj",            /* widget name */
  450.            commandWidgetClass,  /* widget class from Command.h */
  451.            gbform,              /* parent widget */
  452.            NULL);               /* terminate varargs list */
  453.    XtAddCallback(g_proj, XtNcallback, Proj, NULL);
  454.    XtSetSensitive(g_proj, FALSE);
  455.  
  456.    g_color = XtVaCreateManagedWidget(
  457.            "g_color",           /* widget name */
  458.            commandWidgetClass,  /* widget class from Command.h */
  459.            gbform,              /* parent widget */
  460.            NULL);               /* terminate varargs list */
  461.    XtAddCallback(g_color, XtNcallback, Color, NULL);
  462.  
  463.    glabel = XtVaCreateManagedWidget(
  464.            "glabel",            /* widget name */
  465.            labelWidgetClass,    /* widget class from Label.h */
  466.            gform,               /* parent widget */
  467.            NULL);               /* terminate varargs list */
  468.  
  469.    gram = XtVaCreateManagedWidget(
  470.            "gram",              /* widget name */
  471.            asciiTextWidgetClass,  /* widget class from AsciiText.h */
  472.            gform,               /* parent widget */
  473.            NULL);               /* terminate varargs list */  
  474.  
  475.    g_ok = XtVaCreateManagedWidget(
  476.            "g_ok",              /* widget name */
  477.            commandWidgetClass,  /* widget class from Command.h */
  478.            gform,               /* parent widget */
  479.            NULL);               /* terminate varargs list */
  480.    XtAddCallback(g_ok, XtNcallback, GOk, (XtPointer) gram);
  481.  
  482.    g_stop = XtVaCreateManagedWidget(
  483.            "g_stop",            /* widget name */
  484.            commandWidgetClass,  /* widget class from Command.h */
  485.            gform,               /* paarent widget class */
  486.            NULL);               /* terminate varargs list */
  487.    XtAddCallback(g_stop, XtNcallback, GStop, NULL);
  488.    XtSetSensitive(g_stop, FALSE);
  489.  
  490.    g_help = XtVaCreateManagedWidget(
  491.            "g_help",            /* widget name */
  492.            commandWidgetClass,  /* widget class from Command.h */
  493.            gform,               /* parent widget */
  494.            NULL);               /* terminate varargs list */
  495.    XtAddCallback(g_help, XtNcallback, Help, NULL);
  496.  
  497.  /***************************************************************/
  498.    buttonform = XtVaCreateManagedWidget(
  499.            "buttonform",        /* arbitrary widget name */
  500.            formWidgetClass,     /* widget class from Form.h */ 
  501.            paned,               /* parent widget */
  502.            NULL);               /* terminate varargs list */
  503.  
  504.    nextderiv = XtVaCreateManagedWidget(
  505.            "nextderiv",         /* arbitrary widget name */
  506.            commandWidgetClass,  /* widget class from Command.h */ 
  507.            buttonform,          /* parent widget */
  508.            NULL);               /* terminate varargs list */ 
  509.    XtAddCallback(nextderiv, XtNcallback, NextDeriv, NULL);
  510.    XtSetSensitive(nextderiv, FALSE);
  511.  
  512.    prevderiv = XtVaCreateManagedWidget(
  513.            "prevderiv",         /* arbitrary widget name */
  514.            commandWidgetClass,  /* widget class from Command.h */ 
  515.            buttonform,          /* parent widget */
  516.            NULL);               /* terminate varargs list */ 
  517.    XtAddCallback(prevderiv, XtNcallback, PrevDeriv, NULL);
  518.    XtSetSensitive(prevderiv, FALSE);
  519.  
  520.    singlesymbol = XtVaCreateManagedWidget(
  521.            "singlesymbol",      /* arbitrary widget name */
  522.            commandWidgetClass,  /* widget class from Command.h */ 
  523.            buttonform,          /* parent widget */
  524.            NULL);               /* terminate varargs list */ 
  525.    XtAddCallback(singlesymbol, XtNcallback, SingleSymbol, NULL);
  526.    XtSetSensitive(singlesymbol, FALSE);
  527.  
  528.    continuesymbol = XtVaCreateManagedWidget(
  529.            "continuesymbol",    /* arbitrary widget name */
  530.            commandWidgetClass,  /* widget class from Command.h */ 
  531.            buttonform,          /* parent widget */
  532.            NULL);               /* terminate varargs list */ 
  533.    XtAddCallback(continuesymbol, XtNcallback, ContinueSymbol, NULL);
  534.    XtSetSensitive(continuesymbol, FALSE);
  535.  
  536.    quit = XtVaCreateManagedWidget(
  537.            "quit",              /* arbitrary widget name */
  538.            commandWidgetClass,  /* widget class from Command.h */ 
  539.            buttonform,          /* parent widget */
  540.            NULL);               /* terminate varargs list */ 
  541.    XtAddCallback(quit, XtNcallback, Quit, NULL);
  542.  
  543.    load = XtVaCreateManagedWidget(
  544.            "load",              /* arbitrary widget name */
  545.            commandWidgetClass,  /* widget class from Command.h */ 
  546.            buttonform,          /* parent widget */
  547.            NULL);               /* terminate varargs list */ 
  548.    XtAddCallback(load, XtNcallback, Load, NULL);
  549.  
  550.    save = XtVaCreateManagedWidget(
  551.            "save",              /* arbitrary widget name */
  552.            commandWidgetClass,  /* widget class from Command.h */ 
  553.            buttonform,          /* parent widget */
  554.            NULL);               /* terminate varargs list */ 
  555.    XtAddCallback(save, XtNcallback, Save, NULL);
  556.    XtSetSensitive(save, FALSE);
  557.  
  558.   /*****************************************************************/
  559.  
  560.   /* Create windows for widgets and map them */
  561.   XtRealizeWidget(topLevel);
  562.  
  563.   /* Map popup Widget */
  564.   XtPopup(popup, XtGrabNone);
  565.  
  566.   /* Initialisieren der Pixmap und des GC zum Zeichnen in drawing */
  567.   init_drawing(topLevel, drawing);
  568.  
  569.  
  570.   /* Farbbildschirm, d.h. Farbpalette soll anwaehlbar sein */
  571.   if (DefaultDepth(display,screen) == 1)
  572.   {
  573.     XtSetSensitive(g_color, FALSE);
  574.   }
  575.  
  576.   init_color();
  577.  
  578.  
  579.   /* Default-Werte fuer die perspektivische Projektion */
  580.   persp_a  = 1000;
  581.   persp_x0 = 0;
  582.   persp_y0 = 0;
  583.  
  584.   /* Speicher fuer aktuelle Turtlewerte anlegen */
  585.   turtle = (TURTLE_VALUES *)malloc(sizeof(TURTLE_VALUES));
  586.   if (turtle == NULL)
  587.   {
  588.     fprintf(stderr, "Kein Speicher mehr frei!\n");
  589.     fprintf(stderr, "malloc-Aufruf in main\n");
  590.     exit(1);
  591.   }
  592.  
  593.   /* Berechnen der Sinus-/Cosinus-Werte fuer eine Tabelle */
  594.   for (i=0; i<361; i++)
  595.   {
  596.     winkel = i * PI /180;
  597.     SI[i] = sin(winkel);
  598.     CO[i] = cos(winkel);
  599.   }
  600.  
  601.   SI[0]   = 0.0; SI[30]  = 0.5;  SI[90]  = 1.0;  SI[150] = 0.5; 
  602.   SI[180] = 0.0; SI[210] = -0.5; SI[270] = -1.0; SI[330] = -0.5; 
  603.   SI[360] = 0.0;
  604.  
  605.   CO[0]   = 1.0;  CO[60]  = 0.5;  CO[90]  = 0; CO[120] = -0.5;
  606.   CO[180] = -1.0; CO[240] = -0.5; CO[270] = 0; CO[300] = 0.5;
  607.   CO[360] = 1.0;
  608.  
  609.  
  610.   /* Loop for events */
  611.    XtAppMainLoop(app_context);
  612.  
  613. /* end of main */
  614.  
  615.  
  616. /*************************************************************************/
  617. /* Function Name: RestorePicture
  618.  * Description: Erneuert das Bild in drawing nach einem Expose-Event
  619.  * Arguments: w           - drawing
  620.  *            client_data - NULL
  621.  *            event       - ExposeEvent
  622.  * Globals: display
  623.  *          draw_pixmap
  624.  *          draw_gc
  625.  *          draw_width
  626.  *          draw_height
  627.  * Returns: none
  628.  */
  629.  
  630. void RestorePicture(w, client_data, event)
  631. Widget w;
  632. XtPointer client_data;
  633. XEvent *event;
  634. {
  635.   XCopyArea(display, draw_pixmap, XtWindow(w), draw_gc,
  636.             0,0, (int)draw_width, (int)draw_height, 0,0);
  637. }
  638.  
  639. /*************************************************************************/
  640. /* Function Name: Dummy
  641.  * Description: "do nothing"
  642.  * Arguments: unused
  643.  */
  644.  
  645. /* ARGSUSED */
  646. void Dummy(w, client_data, call_data)
  647. Widget w;
  648. XtPointer client_data, call_data;
  649. {
  650.   /* do nothing */
  651. }
  652.  
  653. /*************************************************************************/
  654. /* Function Name: syntax
  655.  * Description: prints the unknown arguments for this function.
  656.  * Arguments: app_context
  657.  *            call - the name of the application
  658.  */
  659.  
  660. /* ARGSUSED */
  661. void syntax(app_context, call)
  662. XtAppContext app_context;
  663. char *call;
  664. {
  665.   XtDestroyApplicationContext(app_context);
  666.   fprintf(stderr, " Argument(e) unbekannt: %s\n", call);
  667.   exit(1);
  668. }
  669.  
  670. /*************************************************************************/
  671. /* Function Name: Help
  672.  * Description: Oeffnet ein Fenster, das einen Helptext und einen OK-Button
  673.  *              zum Beenden den Hilfe enthaelt.
  674.  *              Button help wird "insensitive" gesetzt.
  675.  * Arguments: w - Widget, das Callback ausgeloest hat
  676.  */
  677.  
  678. /* ARGSUSED */
  679. void Help(w, client_data, call_data)
  680. Widget w;
  681. XtPointer client_data, call_data;
  682. {
  683.   Widget popup,
  684.          helpform,
  685.          helptext,
  686.          helpok;
  687.  
  688.   popup = XtVaCreatePopupShell(
  689.           "lgrammar_help",           /* widget name */
  690.           topLevelShellWidgetClass,  /* widget class from Shell.h */
  691.           w,                         /* parent widget */   
  692.           NULL);                     /* terminate varargs list */
  693.  
  694.   helpform = XtVaCreateManagedWidget(
  695.           "helpform",                /* widget name */
  696.           formWidgetClass,           /* widget class from Form.h */
  697.           popup,                     /* parent widget */
  698.           NULL);                     /* terminate varargs list */
  699.  
  700.   helptext = XtVaCreateManagedWidget(
  701.           "helptext",                /* widget name */
  702.           asciiTextWidgetClass,      /* widget class from AsciiText.h */
  703.           helpform,                  /* parent widget */
  704.           NULL);                     /* terminate varargs list */
  705.  
  706.   helpok = XtVaCreateManagedWidget(
  707.           "helpok",                  /* widget name */
  708.           commandWidgetClass,        /* widget class from Command.h */
  709.           helpform,                  /* parent widget */
  710.           NULL);                     /* terminate varargs list */
  711.   XtAddCallback(helpok, XtNcallback, HelpOk, NULL);
  712.  
  713.   XtSetSensitive(w, FALSE);
  714.  
  715.   XtPopup(popup, XtGrabNone);
  716. }
  717.  
  718. /*************************************************************************/
  719. /* Function Name: HelpOk
  720.  * Description: schliest das Help-Fenster und setzt den Button fuer Help
  721.  *              wieder auf "sensitive" 
  722.  * Arguments: w - Widget, das den Callback ausgeloest hat
  723.  */
  724.  
  725. /* ARGSUSED */
  726. void HelpOk(w, client_data, call_data)
  727. Widget w;
  728. XtPointer client_data, call_data;
  729. {
  730.   Widget popup = XtParent(XtParent(w));
  731.   Widget button  = XtParent(popup);
  732.  
  733.   XtSetSensitive(button, TRUE);
  734.   XtDestroyWidget(popup);
  735. }
  736.  
  737. /*************************************************************************/
  738. /* Function Name: G3D
  739.  * Description: 
  740.  * Arguments: w - Widget, das den Callback ausgeloest hat
  741.  * Globals: a lot
  742.  */
  743.  
  744. /* ARGSUSED */
  745. void G3D(w, client_data, call_data)
  746. Widget w;
  747. XtPointer client_data, call_data;
  748. {
  749.   String s_label;
  750.  
  751.   /* bestehende Beschriftung lesen */
  752.   XtVaGetValues(w, XtNlabel, &s_label, NULL);
  753.   if (strcmp(s_label, "2D") == 0)
  754.   {
  755.     /* neue Beschriftung = 3D */
  756.     XtVaSetValues(w, XtNlabel, "3D", NULL);
  757.  
  758.     XtSetSensitive(g_posz, TRUE);
  759.     XtSetSensitive(g_headz, TRUE);
  760.     XtSetSensitive(g_leftx, TRUE);
  761.     XtSetSensitive(g_lefty, TRUE);
  762.     XtSetSensitive(g_leftz, TRUE);
  763.     XtSetSensitive(g_upx, TRUE);
  764.     XtSetSensitive(g_upy, TRUE);
  765.     XtSetSensitive(g_upz, TRUE);
  766.     XtSetSensitive(g_proj, TRUE);
  767.   }
  768.   else
  769.   {
  770.     /* neue Beschriftung = 2D */
  771.     XtVaSetValues(w, XtNlabel, "2D", NULL);
  772.  
  773.     XtSetSensitive(g_posz, FALSE);
  774.     XtSetSensitive(g_headz, FALSE);
  775.     XtSetSensitive(g_leftx, FALSE);
  776.     XtSetSensitive(g_lefty, FALSE);
  777.     XtSetSensitive(g_leftz, FALSE);
  778.     XtSetSensitive(g_upx, FALSE);
  779.     XtSetSensitive(g_upy, FALSE);
  780.     XtSetSensitive(g_upz, FALSE);
  781.     XtSetSensitive(g_proj, FALSE);
  782.   }
  783. }
  784.  
  785. /*************************************************************************/
  786. /* Function Name: Proj
  787.  * Description: 
  788.  * Arguments: w - Widget, das den callback ausgeloest hat
  789.  * Globals: a lot
  790.  */
  791.  
  792. /* ARGSUSED */
  793. void Proj(w, client_data, call_data)
  794. Widget w;
  795. XtPointer client_data, call_data;
  796. {
  797.   Widget popup,
  798.          projform,
  799.          projok,
  800.          projcancel;
  801.  
  802.   char *str;
  803.   Arg args[2];
  804.  
  805.   popup = XtVaCreatePopupShell( 
  806.           "lgrammar_proj",           /* widget name */
  807.           topLevelShellWidgetClass,  /* widget class from Shell.h */
  808.           w,                         /* parent widget */   
  809.           NULL);                     /* terminate varargs list */
  810.  
  811.   projform = XtVaCreateManagedWidget(
  812.           "projform",                /* widget name */
  813.           formWidgetClass,           /* widget class from Form.h */
  814.           popup,                     /* parent widget */
  815.           NULL);                     /* terminate varargs list */
  816.  
  817.   proj_x0 = XtVaCreateManagedWidget(
  818.           "proj_x0",                 /* widget name */
  819.           dialogWidgetClass,         /* widget class from Dialog.h */
  820.           projform,                  /* parent widget */
  821.           NULL);                     /* terminate varargs list */  
  822.  
  823.   proj_y0 = XtVaCreateManagedWidget(
  824.           "proj_y0",                 /* widget name */
  825.           dialogWidgetClass,         /* widget class from Dialog.h */
  826.           projform,                  /* parent widget */
  827.           NULL);                     /* terminate varargs list */  
  828.  
  829.   proj_a = XtVaCreateManagedWidget(
  830.           "proj_a",                  /* widget name */
  831.           dialogWidgetClass,         /* widget class from Dialog.h */
  832.           projform,                  /* parent widget */
  833.           NULL);                     /* terminate varargs list */  
  834.  
  835.   projok = XtVaCreateManagedWidget(
  836.           "projok",                  /* widget name */
  837.           commandWidgetClass,        /* widget class from Command.h */
  838.           projform,                  /* parent widget */
  839.           NULL);                     /* terminate varargs list */
  840.   XtAddCallback(projok, XtNcallback, ProjOk, NULL);
  841.  
  842.   projcancel = XtVaCreateManagedWidget(
  843.           "projcancel",              /* widget name */
  844.           commandWidgetClass,        /* widget class from Command.h */
  845.           projform,                  /* parent widget */
  846.           NULL);                     /* terminate varargs list */
  847.   XtAddCallback(projcancel, XtNcallback, ProjCancel, NULL);
  848.  
  849.   XtSetSensitive(w, FALSE);
  850.  
  851.   XtPopup(popup, XtGrabNonexclusive);
  852.  
  853.   /* in Popup aktuelle Werte von persp_a, persp_x0 und persp_y0 anzeigen */ 
  854.   str = (char *)malloc(5*sizeof(char));
  855.   if (str == NULL)
  856.   {
  857.     fprintf(stderr, "Kein Speicher mehr frei!\n");
  858.     fprintf(stderr, "malloc-Aufruf in Proj\n");
  859.     exit(1);
  860.   }
  861.  
  862.   sprintf(str, "%d", persp_x0);
  863.   XtSetArg(args[0], XtNvalue, str);
  864.   XtSetValues(proj_x0, args, ONE);
  865.  
  866.   sprintf(str, "%d", persp_y0);
  867.   XtSetArg(args[0], XtNvalue, str);
  868.   XtSetValues(proj_y0, args, ONE);
  869.  
  870.   sprintf(str, "%d", persp_a);
  871.   XtSetArg(args[0], XtNvalue, str);
  872.   XtSetValues(proj_a, args, ONE);
  873.  
  874.   free(str);
  875. }
  876.  
  877. /*************************************************************************/
  878. /* Function Name: ProjOk
  879.  * Description: 
  880.  * Arguments: w - Widget, das den Callback ausgeloest hat
  881.  * Globals: 
  882.  */
  883.  
  884. /* ARGSUSED */
  885. void ProjOk(w, client_data, call_data)
  886. Widget w;
  887. XtPointer client_data, call_data;
  888. {
  889.   Widget popup = XtParent(XtParent(w));
  890.   Widget button = XtParent(popup);
  891.  
  892.   String s_value;
  893.  
  894.   /* Einlesen der eingegeben Werte in Proj */
  895.  
  896.   XtVaGetValues(proj_x0, XtNvalue, &s_value, NULL);
  897.   persp_x0 = (int)(atof(s_value));
  898.  
  899.   XtVaGetValues(proj_y0, XtNvalue, &s_value, NULL);
  900.   persp_y0 = (int)(atof(s_value));
  901.  
  902.   XtVaGetValues(proj_a, XtNvalue, &s_value, NULL);
  903.   persp_a = (double)(atof(s_value));
  904.  
  905.   XtSetSensitive(button, TRUE);
  906.   XtDestroyWidget(popup);
  907. }
  908.  
  909. /*************************************************************************/
  910. /* Function Name: ProjCancel
  911.  * Description: 
  912.  * Arguments: w - Widget, das den Callback ausgeloest hat
  913.  */
  914.  
  915. /* ARGSUSED */
  916. void ProjCancel(w, client_data, call_data)
  917. Widget w;
  918. XtPointer client_data, call_data;
  919. {
  920.   Widget popup = XtParent(XtParent(w));
  921.   Widget button = XtParent(popup);
  922.  
  923.   XtSetSensitive(button, TRUE);
  924.   XtDestroyWidget(popup);
  925. }
  926.  
  927. /*************************************************************************/
  928. /* Function Name: GOk
  929.  * Description: 
  930.  * Arguments: 
  931.  * Globals: 
  932.  * Returns: 
  933.  */
  934.  
  935. /* ARGSUSED */
  936. void GOk(w, client_data, call_data)
  937. Widget w;
  938. XtPointer client_data, call_data;
  939. {
  940.   Widget eingabe = (Widget) client_data;
  941.   String str_eingabe;           /* liest Grammatik ein */
  942.  
  943.   int fehler = 0;               /* Klammersetzung korrekt ? */
  944.  
  945.   Widget gfehler,               /* Popup-Fenster fuer falsche Klammern */
  946.          gfehlerlabel;          /* Fehlermeldung */
  947.   Position x, y;                /* Postion des Popups */
  948.   Dimension width, height;      /* Groesse des Popups */
  949.   Widget topLevel = XtParent(XtParent(XtParent(w)));
  950.  
  951.   String s_value;
  952.  
  953.   Arg arg[1];
  954.   char newlabel[BUFSIZ];
  955.  
  956.   char text[3];  /* Label fuer g_3d, wechselt zwischen 2D und 3D */
  957.  
  958.  
  959.   XtSetSensitive(g_stop, FALSE);
  960.  
  961.   XtVaGetValues(eingabe, XtNstring,&str_eingabe,NULL);
  962.   if (strlen(str_eingabe) < 1)
  963.   {
  964.     /* zu wenig Zeichen fuer eine Grammatik */
  965.   }
  966.   else
  967.   {
  968.     /* Index bzw. Zusatz auf korrekte '<','>' pruefen, Klammern pruefen */
  969.     fehler = klammern_pruefen (str_eingabe);
  970.  
  971.     if (fehler == 0)
  972.     {
  973.       if (grammar)
  974.       {
  975.         /* bestehende grammar loeschen */
  976.         grammar = delete_grammarlist(grammar);
  977.       }
  978.       /* grammar aufbauen */
  979.       grammar = init_grammar(str_eingabe);
  980.  
  981.       if (grammar != NULL)
  982.       {
  983.         /* Klammerung in Grammatik testen */
  984.         fehler = klammerung(grammar);
  985.       }
  986.       else
  987.       {
  988.         /* Grammatik fehlerhaft */
  989.         fehler = 10;
  990.       }
  991.  
  992.       if (fehler == 0)
  993.       {
  994.         /* Wahrscheinlichkeiten ueberpruefen */
  995.         fehler = test_wk(grammar);
  996.       }
  997.     }
  998.  
  999.     switch (fehler)
  1000.     {
  1001.     case 0:
  1002.  
  1003.        sprintf(newlabel, "Grammar:");
  1004.        XtSetArg(arg[0], XtNlabel, newlabel);
  1005.        XtSetValues(glabel, arg, ONE);
  1006.  
  1007.        /* Axiom ausgeben */
  1008.        if (word)
  1009.        {
  1010.          /* bestehendes word wird geloescht */
  1011.          word = delete_wordlist(word);
  1012.        }
  1013.        /* word mit Axiom initialisieren */
  1014.        init_word();
  1015.        display_word();
  1016.  
  1017.        /* Zahl der Ableitungen ausgeben */
  1018.        count_deriv = 0;
  1019.        display_deriv();
  1020.  
  1021.        color_index = 0;
  1022.  
  1023.        /* Einlesen der eingegeben Werte in die Struktur turtle */
  1024.        XtVaGetValues(g_posx, XtNvalue, &s_value, NULL);
  1025.        turtle->pos.x = (double)(atof(s_value));
  1026.  
  1027.        XtVaGetValues(g_posy, XtNvalue, &s_value, NULL);
  1028.        turtle->pos.y = (double)(atof(s_value));
  1029.  
  1030.        XtVaGetValues(g_posz, XtNvalue, &s_value, NULL);
  1031.        turtle->pos.z = (double)(atof(s_value));
  1032.  
  1033.        XtVaGetValues(g_headx, XtNvalue, &s_value, NULL);
  1034.        turtle->h.x = (double)(atof(s_value));
  1035.  
  1036.        XtVaGetValues(g_heady, XtNvalue, &s_value, NULL);
  1037.        turtle->h.y = (double)(atof(s_value));
  1038.  
  1039.        XtVaGetValues(g_headz, XtNvalue, &s_value, NULL);
  1040.        turtle->h.z = (double)(atof(s_value));
  1041.  
  1042.        XtVaGetValues(g_leftx, XtNvalue, &s_value, NULL);
  1043.        turtle->l.x = (double)(atof(s_value));
  1044.  
  1045.        XtVaGetValues(g_lefty, XtNvalue, &s_value, NULL);
  1046.        turtle->l.y = (double)(atof(s_value));
  1047.  
  1048.        XtVaGetValues(g_leftz, XtNvalue, &s_value, NULL);
  1049.        turtle->l.z = (double)(atof(s_value));
  1050.  
  1051.        XtVaGetValues(g_upx, XtNvalue, &s_value, NULL);
  1052.        turtle->u.x = (double)(atof(s_value));
  1053.  
  1054.        XtVaGetValues(g_upy, XtNvalue, &s_value, NULL);
  1055.        turtle->u.y = (double)(atof(s_value));
  1056.   
  1057.        XtVaGetValues(g_upz, XtNvalue, &s_value, NULL);
  1058.        turtle->u.z = (double)(atof(s_value));
  1059.  
  1060.        XtVaGetValues(g_angle, XtNvalue, &s_value, NULL);
  1061.        turtle->angle = (double)(atof(s_value));
  1062.  
  1063.        XtVaGetValues(g_length, XtNvalue, &s_value, NULL);
  1064.        turtle->length = atoi(s_value);
  1065.  
  1066.        XtVaGetValues(g_scale, XtNvalue, &s_value, NULL);
  1067.        turtle->scale = (double)(atof(s_value));
  1068.  
  1069.  
  1070.        /* Test, ob 2D- oder 3D-Symbole in der Grammatik enthalten sind */
  1071.        dimens = test_dimens(str_eingabe);
  1072.        if (dimens == 3)
  1073.        {
  1074.          turtle_3D(drawing, count_deriv, turtle);
  1075.  
  1076.          sprintf(text, "3D");
  1077.          XtSetArg(arg[0], XtNlabel, text);
  1078.          XtSetValues(g_3d, arg, ONE);
  1079.  
  1080.          XtSetSensitive(g_posz, TRUE);
  1081.          XtSetSensitive(g_headz, TRUE);
  1082.          XtSetSensitive(g_leftx, TRUE);
  1083.          XtSetSensitive(g_lefty, TRUE);
  1084.          XtSetSensitive(g_leftz, TRUE);
  1085.          XtSetSensitive(g_upx, TRUE);  
  1086.          XtSetSensitive(g_upy, TRUE);  
  1087.          XtSetSensitive(g_upz, TRUE);
  1088.          XtSetSensitive(g_proj, TRUE);
  1089.        }
  1090.        else
  1091.        {
  1092.          turtle_2D(drawing, count_deriv, turtle);
  1093.  
  1094.          sprintf(text, "2D");
  1095.          XtSetArg(arg[0], XtNlabel, text);
  1096.          XtSetValues(g_3d, arg, ONE);
  1097.  
  1098.          XtSetSensitive(g_posz, FALSE);
  1099.          XtSetSensitive(g_headz, FALSE);
  1100.          XtSetSensitive(g_leftx, FALSE);
  1101.          XtSetSensitive(g_lefty, FALSE);
  1102.          XtSetSensitive(g_leftz, FALSE);
  1103.          XtSetSensitive(g_upx, FALSE);
  1104.          XtSetSensitive(g_upy, FALSE);
  1105.          XtSetSensitive(g_upz, FALSE);
  1106.          XtSetSensitive(g_proj, FALSE);
  1107.        }
  1108.  
  1109.        XtSetSensitive(nextderiv, TRUE);
  1110.        XtSetSensitive(prevderiv, FALSE);
  1111.        XtSetSensitive(singlesymbol, TRUE);
  1112.        XtSetSensitive(continuesymbol, FALSE);
  1113.        XtSetSensitive(save, TRUE);
  1114.  
  1115.        break;
  1116.  
  1117.  
  1118.     case 1: /* Klammersetzung nicht in Ordnung, Meldung ausgeben */
  1119.  
  1120.        /* get the coordinates of the button widget */
  1121.        XtVaGetValues(w,
  1122.               XtNwidth, &width,
  1123.               XtNheight, &height,
  1124.               NULL);
  1125.  
  1126.        /* translate coords in application button window 
  1127.         * into coords from root window */
  1128.        XtTranslateCoords(w,           /* Widget */
  1129.               (Position) (width-5),   /* x */
  1130.               (Position) (height-50), /* y */
  1131.               &x, &y);                /* coords on root window */
  1132.  
  1133.        gfehler = XtVaCreatePopupShell(
  1134.                  "gfehler",                 /* widget name */
  1135.                  overrideShellWidgetClass,  /* widget class from Shell.h */
  1136.                  w,                         /* parent widget */
  1137.                  NULL);                     /* terminate varargs list */
  1138.  
  1139.        /* move popup shell to this position */
  1140.        XtVaSetValues(gfehler,
  1141.               XtNx, x,
  1142.               XtNy, y,
  1143.               NULL);
  1144.  
  1145.        gfehlerlabel = XtVaCreateManagedWidget(
  1146.                    "Klammersetzung!",    /* widget name */
  1147.                    commandWidgetClass,   /* widget class from Command.h */
  1148.                    gfehler,              /* parent widget */
  1149.                    NULL);                /* terminate varargs list */
  1150.        XtAddCallback(gfehlerlabel, XtNcallback, Fehler, NULL);
  1151.  
  1152.        XtSetSensitive(XtParent(gfehler),FALSE);
  1153.        XtPopup(gfehler, XtGrabNonexclusive);
  1154.        XBell(XtDisplay(topLevel), 0);
  1155.        break;
  1156.  
  1157.     case 10: /* Grammatik nicht in Ordnung */
  1158.        sprintf(newlabel, "GRAMMAR: Check '='");
  1159.        XtSetArg(arg[0], XtNlabel, newlabel);
  1160.        XtSetValues(glabel, arg, ONE);
  1161.        XBell(XtDisplay(topLevel), 0);
  1162.        break;
  1163.  
  1164.     case 20: /* Wahrscheinlichkeitsangaben nicht in Ordnung */
  1165.        sprintf(newlabel, "GRAMMAR: Check probabilities");
  1166.        XtSetArg(arg[0], XtNlabel, newlabel);
  1167.        XtSetValues(glabel, arg, ONE);
  1168.        XBell(XtDisplay(topLevel), 0);
  1169.        break;
  1170.  
  1171.       break;
  1172.  
  1173.     } /* end of switch */
  1174.   } /* end of else */
  1175. } /* end of G_ok */
  1176.  
  1177. /*************************************************************************/
  1178. /* Function Name: display_deriv
  1179.  * Description: 
  1180.  * Arguments: 
  1181.  * Globals: 
  1182.  * Returns: 
  1183.  */
  1184.  
  1185. void display_deriv()
  1186. {
  1187.   char text[5];
  1188.  
  1189.   sprintf(text, "%d", count_deriv);
  1190.   XtVaSetValues(wderiv, XtNlabel, text, NULL);
  1191. }
  1192.  
  1193. /*************************************************************************/
  1194. /* Function Name: display_word
  1195.  * Description: 
  1196.  * Arguments: 
  1197.  * Globals: 
  1198.  * Returns: 
  1199.  */
  1200.  
  1201. void display_word()
  1202. {
  1203.   str[0] = XtNewString((String *)word_to_string(word, current_symbol));
  1204.   XawListChange(wlist, str, 1, 0, TRUE);
  1205. }
  1206.  
  1207. /*************************************************************************/
  1208. /* Function Name: Fehler
  1209.  * Description: 
  1210.  * Arguments: 
  1211.  * Globals: 
  1212.  * Returns: 
  1213.  */
  1214.  
  1215. /* ARGSUSED */
  1216. void Fehler(w, client_data, call_data)
  1217. Widget w;
  1218. XtPointer client_data, call_data;
  1219. {
  1220.   Widget popup = XtParent(w);
  1221.   Widget button = XtParent(popup);
  1222.  
  1223.   XtSetSensitive(button, TRUE);
  1224.  
  1225.   XtDestroyWidget(popup);
  1226. }
  1227.  
  1228. /*************************************************************************/
  1229. /* Function Name: GStop
  1230.  * Description: 
  1231.  * Arguments: 
  1232.  * Globals: 
  1233.  * Returns: 
  1234.  */
  1235.  
  1236. /* ARGSUSED */
  1237. void GStop(w, client_data, call_data)
  1238. Widget w;
  1239. XtPointer client_data, call_data;
  1240. {
  1241.   anhalten = TRUE;
  1242. }
  1243.  
  1244. /*************************************************************************/
  1245. /* Function Name: NextDeriv
  1246.  * Description: 
  1247.  * Arguments: 
  1248.  * Globals: 
  1249.  * Returns: 
  1250.  */
  1251.  
  1252. /* ARGSUSED */
  1253. void NextDeriv(w, client_data, call_data)
  1254. Widget w;
  1255. XtPointer client_data,
  1256.           call_data; 
  1257. {
  1258.   count_deriv ++;
  1259.   display_deriv();
  1260.  
  1261.   ableitung_wort();
  1262.   display_word();
  1263.  
  1264.  
  1265.   XtSetSensitive(prevderiv, TRUE);
  1266.  
  1267.   if (dimens == 3)
  1268.   {
  1269.     turtle_3D(drawing, count_deriv, turtle);
  1270.   }
  1271.   else
  1272.   {
  1273.     turtle_2D(drawing, count_deriv, turtle);
  1274.   }
  1275. }
  1276.  
  1277. /*************************************************************************/
  1278. /* Function Name: PrevDeriv
  1279.  * Description: 
  1280.  * Arguments: 
  1281.  * Globals: 
  1282.  * Returns: 
  1283.  */
  1284.  
  1285. /* ARGSUSED */
  1286. void PrevDeriv(w, client_data, call_data)
  1287. Widget w;
  1288. XtPointer client_data, call_data;
  1289. {
  1290.   int i;
  1291.  
  1292.   count_deriv--;
  1293.   display_deriv();
  1294.  
  1295.   word = delete_wordlist(word);
  1296.   init_word();
  1297.  
  1298.   for (i=0; i<count_deriv; i++)
  1299.   {
  1300.     ableitung_wort();
  1301.   }
  1302.   display_word();
  1303.  
  1304.   if (count_deriv < 1)
  1305.   {
  1306.     XtSetSensitive(prevderiv, FALSE);
  1307.   }
  1308.  
  1309.   if (dimens == 3)
  1310.   {
  1311.     turtle_3D(drawing, count_deriv, turtle);
  1312.   }
  1313.   else
  1314.   {
  1315.     turtle_2D(drawing, count_deriv, turtle);
  1316.   }
  1317. }
  1318.  
  1319. /*************************************************************************/
  1320. /* Function Name: SingleSymbol
  1321.  * Description: 
  1322.  * Arguments: 
  1323.  * Globals: 
  1324.  * Returns: 
  1325.  */
  1326.  
  1327. /* ARGSUSED */
  1328. void SingleSymbol(w, client_data, call_data)
  1329. Widget w;
  1330. XtPointer client_data, call_data;
  1331. {
  1332.   if (word == current_symbol)
  1333.   {
  1334.     count_deriv ++;
  1335.     display_deriv();
  1336.   }
  1337.  
  1338.   ableitung_symbol();
  1339.   display_word();
  1340.  
  1341.   if(word != current_symbol)
  1342.   {
  1343.     XtSetSensitive(nextderiv, FALSE);
  1344.     XtSetSensitive(prevderiv, FALSE);
  1345.     XtSetSensitive(continuesymbol, TRUE);
  1346.   }
  1347.   else
  1348.   {
  1349.     XtSetSensitive(nextderiv, TRUE);
  1350.     XtSetSensitive(prevderiv, TRUE);
  1351.     XtSetSensitive(continuesymbol, FALSE);
  1352.   }
  1353.  
  1354.   if (dimens == 3)
  1355.   {
  1356.     turtle_3D(drawing, count_deriv, turtle);
  1357.   }
  1358.   else
  1359.   {
  1360.     turtle_2D(drawing, count_deriv, turtle);
  1361.   }
  1362. }
  1363.  
  1364. /*************************************************************************/
  1365. /* Function Name: ContinueSymbol
  1366.  * Description: 
  1367.  * Arguments: 
  1368.  * Globals: 
  1369.  * Returns: 
  1370.  */
  1371.  
  1372. /* ARGSUSED */
  1373. void ContinueSymbol(w, client_data, call_data)
  1374. Widget w;
  1375. XtPointer client_data, call_data;
  1376. {
  1377.   while (word != current_symbol)
  1378.   {
  1379.     ableitung_symbol();
  1380.   }
  1381.   display_word();
  1382.  
  1383.   XtSetSensitive(nextderiv, TRUE);
  1384.   XtSetSensitive(prevderiv, TRUE);
  1385.   XtSetSensitive(continuesymbol,FALSE);
  1386.  
  1387.   if (dimens == 3)
  1388.   {
  1389.     turtle_3D(drawing, count_deriv, turtle);
  1390.   }
  1391.   else
  1392.   {
  1393.     turtle_2D(drawing, count_deriv, turtle);
  1394.   }
  1395. }
  1396.  
  1397. /*************************************************************************/
  1398. /* Function Name: Save
  1399.  * Description: 
  1400.  * Arguments: 
  1401.  * Globals: 
  1402.  * Returns: 
  1403.  */
  1404.  
  1405. /* ARGSUSED */
  1406. void Save(w, client_data, call_data)
  1407. Widget w;
  1408. XtPointer client_data, call_data;
  1409. {
  1410.   Widget popup,
  1411.          saveform,
  1412.          saveok,
  1413.          savecancel,
  1414.          saveimage,
  1415.          saveobj;
  1416.  
  1417.  
  1418.   char dirname[MAXPATHLEN];  /* Name des aktuellen Verzeichnisses */
  1419.  
  1420.   popup = XtVaCreatePopupShell(
  1421.           "lgrammar_save",           /* widget name */
  1422.           topLevelShellWidgetClass,  /* widget class from Shell.h */
  1423.           w,                         /* parent widget */   
  1424.           NULL);                     /* terminate varargs list */
  1425.  
  1426.   saveform = XtVaCreateManagedWidget(
  1427.           "saveform",           /* widget name */
  1428.           formWidgetClass,      /* widget class from Form.h */
  1429.           popup,                /* parent widget */
  1430.           NULL);                /* terminate varargs list */
  1431.  
  1432.   savesett = XtVaCreateManagedWidget(
  1433.           "savesett",           /* widget name */
  1434.           dialogWidgetClass,    /* widget class from Dialog.h */
  1435.           saveform,             /* parent widget */
  1436.           NULL);                /* terminate varargs list */
  1437.  
  1438.   saveok = XtVaCreateManagedWidget(
  1439.           "saveok",             /* widget name */
  1440.           commandWidgetClass,   /* widget class from Command.h */
  1441.           saveform,             /* parent widget */
  1442.           NULL);                /* terminate varargs list */
  1443.   XtAddCallback(saveok, XtNcallback, SaveOk, NULL);
  1444.  
  1445.   savecancel = XtVaCreateManagedWidget(
  1446.           "savecancel",         /* widget name */
  1447.           commandWidgetClass,   /* widget class from Command.h */
  1448.           saveform,             /* parent widget */
  1449.           NULL);                /* terminate varargs list */
  1450.   XtAddCallback(savecancel, XtNcallback, SaveCancel, NULL);
  1451.  
  1452.   saveimage = XtVaCreateManagedWidget(
  1453.           "saveimage",          /* widget name */
  1454.           commandWidgetClass,   /* widget class from Command.h */
  1455.           saveform,             /* parent widget */
  1456.           NULL);                /* terminate varargs list */
  1457.   XtAddCallback(saveimage, XtNcallback, SaveImage, NULL);
  1458.  
  1459.   saveobj = XtVaCreateManagedWidget(
  1460.           "saveobj",            /* widget name */
  1461.           commandWidgetClass,   /* widget class from Command.h */
  1462.           saveform,             /* parent widget */
  1463.           NULL);                /* terminate varargs list */
  1464.   XtAddCallback(saveobj, XtNcallback, SaveObj, NULL);
  1465.  
  1466.   getwd(dirname);
  1467.   if (dirname == NULL)
  1468.   {
  1469.     printf("getwd\n");
  1470.     exit(1);
  1471.   }
  1472.   XtVaSetValues(savesett, XtNvalue, dirname, NULL);
  1473.  
  1474.  
  1475.   XtSetSensitive(w, FALSE);
  1476.  
  1477.   XtPopup(popup, XtGrabNonexclusive);
  1478. }
  1479.  
  1480. /*************************************************************************/
  1481. /* Function Name: SaveSReturnOk
  1482.  * Description: 
  1483.  * Arguments: w - Widget, das den callback ausgeloest hat
  1484.  * Globals: 
  1485.  * Returns: 
  1486.  */
  1487.  
  1488. /*ARGSUSED*/
  1489. void SaveSReturnOk(w, event, params, num_params)
  1490. Widget w;        
  1491. XEvent *event;        
  1492. String *params;    
  1493. Cardinal *num_params;
  1494. {
  1495.   Widget dialog = XtParent(w);
  1496.  
  1497.   SaveOk(dialog, (XtPointer) dialog, (XtPointer) NULL);
  1498. }
  1499.  
  1500. /*************************************************************************/
  1501. /* Function Name: SaveOk
  1502.  * Description: 
  1503.  * Arguments: 
  1504.  * Globals: 
  1505.  * Returns: 
  1506.  */
  1507.  
  1508. /* ARGSUSED */
  1509. void SaveOk(w, client_data, call_data)
  1510. Widget w;
  1511. XtPointer client_data, call_data;
  1512. {
  1513.   Widget popup = XtParent(XtParent(w));
  1514.   Widget button = XtParent(popup);
  1515.  
  1516.   String settfname   = XawDialogGetValueString(savesett);
  1517.  
  1518.   String leer = "";
  1519.   int savenumber = 0;
  1520.  
  1521.   /* eingelesenen Filenamen vergleichen */
  1522.   if (strcmp(settfname,   leer) != 0) savenumber +=  1;
  1523.  
  1524.   switch (savenumber)
  1525.   {
  1526.   case 0: /* keine Filenamen angegeben */
  1527.  
  1528.      XtSetSensitive(button, TRUE);
  1529.      XtDestroyWidget(popup);
  1530.      break;
  1531.  
  1532.  
  1533.   case 1: /* Save Settings */
  1534.  
  1535.      save_settings_to_file(settfname);
  1536.      XtSetSensitive(button, TRUE);
  1537.      XtDestroyWidget(popup);
  1538.      break;
  1539.  
  1540.   } /*switch*/
  1541. }
  1542.  
  1543. /*************************************************************************/
  1544. /* Function Name: SaveCancel
  1545.  * Description: 
  1546.  * Arguments: 
  1547.  * Globals: 
  1548.  * Returns: 
  1549.  */
  1550.  
  1551. /* ARGSUSED */
  1552. void SaveCancel(w, client_data, call_data)
  1553. Widget w;
  1554. XtPointer client_data, call_data;
  1555. {
  1556.   Widget popup = XtParent(XtParent(w));
  1557.   Widget button = XtParent(popup);
  1558.  
  1559.   XtSetSensitive(button, TRUE);
  1560.   XtDestroyWidget(popup);
  1561. }
  1562.  
  1563. /*************************************************************************/
  1564. /* Function Name: SaveImage
  1565.  * Description: 
  1566.  * Arguments: 
  1567.  * Globals: 
  1568.  * Returns: 
  1569.  */
  1570.  
  1571. /* ARGSUSED */
  1572. void SaveImage(w, call_data, client_data)
  1573. Widget w;
  1574.  
  1575. XtPointer call_data, client_data;
  1576. {
  1577.   Widget popup = XtParent(XtParent(w));
  1578.   Widget button = XtParent(popup);
  1579.  
  1580.   String *cmd;
  1581.  
  1582.   cmd = (String *)malloc(100*sizeof(char));
  1583.   if (cmd == NULL)
  1584.   {
  1585.     fprintf(stdout,"Kein Speicher mehr frei\n");
  1586.     fprintf(stdout,"malloc-Aufruf in SaveImage\n");
  1587.   }
  1588.   sprintf(cmd, "xgrab");
  1589.   system(cmd);
  1590.   free(cmd);
  1591.  
  1592.   XtSetSensitive(button, TRUE);
  1593.   XtDestroyWidget(popup);
  1594. }
  1595.  
  1596. /*************************************************************************/
  1597. /* Function Name: Quit
  1598.  * Description: exits the application
  1599.  * Arguments: unused
  1600.  * Returns: none
  1601.  */
  1602.  
  1603. /* ARGSUSED */
  1604. void Quit(w, client_data, call_data)
  1605. Widget w;
  1606. XtPointer client_data, call_data;
  1607. {
  1608.   XtDestroyApplicationContext(XtWidgetToApplicationContext(w));
  1609.   exit(0);
  1610. }
  1611.  
  1612. /*************************************************************************/
  1613. /* Function Name: save_settings_to_file
  1614.  * Description: 
  1615.  * Arguments: 
  1616.  * Globals: 
  1617.  * Returns: 
  1618.  */
  1619.  
  1620. void save_settings_to_file(filename)
  1621. String filename;
  1622. {
  1623.   FILE *fp;
  1624.   String wert;
  1625.   char *str;
  1626.  
  1627.   int i;
  1628.  
  1629.   if ((fp = fopen(filename, "w")) == NULL)
  1630.   {
  1631.     fprintf(stderr, "Datei konnte nicht geoeffnet werden\n");
  1632.     fprintf(stderr, "fopen in save_settings_to_file\n");
  1633.     exit(1);
  1634.   }
  1635.  
  1636.   /* Einlesen der Farb-Palette */
  1637.   /* col_pal_name */
  1638.   fprintf(fp, "%s\n", col_pal_name);
  1639.  
  1640.  
  1641.   str = (char *)malloc(8 * sizeof(char));
  1642.   if (str == NULL)
  1643.   {
  1644.     fprintf(stderr, "Kein Speicher mehr frei!\n");
  1645.     fprintf(stderr, "malloc-Aufruf in save_settings_to_file\n");
  1646.     exit(1);
  1647.   }
  1648.  
  1649.   /* Einlesen der Farbreihenfolge in File fp */
  1650.   for (i=0; i<NOC; i++)
  1651.   {
  1652.     sprintf(str, "%d", owncolor[i].red);
  1653.     fprintf(fp, "%s ", str);
  1654.     sprintf(str, "%d", owncolor[i].green);
  1655.     fprintf(fp, "%s ", str);
  1656.     sprintf(str, "%d", owncolor[i].blue);
  1657.     fprintf(fp, "%s\n", str);
  1658.   }
  1659.  
  1660.   /* Einlesen der Turtledaten in File fp */
  1661.  
  1662.   /* g_posx */
  1663.   XtVaGetValues(g_posx, XtNvalue, &wert, NULL);
  1664.   fprintf(fp, "%s\n", wert);
  1665.  
  1666.   /* g_posy */
  1667.   XtVaGetValues(g_posy, XtNvalue, &wert, NULL);
  1668.   fprintf(fp, "%s\n", wert);
  1669.  
  1670.   /* g_posz */
  1671.   XtVaGetValues(g_posz, XtNvalue, &wert, NULL);
  1672.   fprintf(fp, "%s\n", wert);
  1673.  
  1674.   /* g_angle */
  1675.   XtVaGetValues(g_angle, XtNvalue, &wert, NULL);
  1676.   fprintf(fp, "%s\n", wert);
  1677.  
  1678.   /* g_length */
  1679.   XtVaGetValues(g_length, XtNvalue, &wert, NULL);
  1680.   fprintf(fp, "%s\n", wert);
  1681.  
  1682.   /* g_scale */
  1683.   XtVaGetValues(g_scale, XtNvalue, &wert, NULL);
  1684.   fprintf(fp, "%s\n", wert);
  1685.  
  1686.  
  1687.   /* g_headx */
  1688.   XtVaGetValues(g_headx, XtNvalue, &wert, NULL);
  1689.   fprintf(fp, "%s\n", wert);
  1690.       
  1691.   /* g_heady */
  1692.   XtVaGetValues(g_heady, XtNvalue, &wert, NULL);
  1693.   fprintf(fp, "%s\n", wert);
  1694.  
  1695.   /* g_headz */
  1696.   XtVaGetValues(g_headz, XtNvalue, &wert, NULL);
  1697.   fprintf(fp, "%s\n", wert);
  1698.  
  1699.   /* g_leftx */
  1700.   XtVaGetValues(g_leftx, XtNvalue, &wert, NULL);
  1701.   fprintf(fp, "%s\n", wert);
  1702.       
  1703.   /* g_lefty */
  1704.   XtVaGetValues(g_lefty, XtNvalue, &wert, NULL);
  1705.   fprintf(fp, "%s\n", wert);
  1706.  
  1707.   /* g_leftz */
  1708.   XtVaGetValues(g_leftz, XtNvalue, &wert, NULL);
  1709.   fprintf(fp, "%s\n", wert);
  1710.  
  1711.   /* g_upx */
  1712.   XtVaGetValues(g_upx, XtNvalue, &wert, NULL);
  1713.   fprintf(fp, "%s\n", wert);
  1714.       
  1715.   /* g_upy */
  1716.   XtVaGetValues(g_upy, XtNvalue, &wert, NULL);
  1717.   fprintf(fp, "%s\n", wert);
  1718.  
  1719.   /* g_upz */
  1720.   XtVaGetValues(g_upz, XtNvalue, &wert, NULL);
  1721.   fprintf(fp, "%s\n", wert);
  1722.  
  1723.  
  1724.   /* persp_x0 */
  1725.   sprintf(str, "%d", persp_x0);
  1726.   fprintf(fp, "%s\n", str);
  1727.  
  1728.   /* persp_y0 */
  1729.   sprintf(str, "%d", persp_y0);
  1730.   fprintf(fp, "%s\n", str);
  1731.  
  1732.   /* persp_a */
  1733.   sprintf(str, "%d", persp_a);
  1734.   fprintf(fp, "%s\n", str);
  1735.  
  1736.   free(str);
  1737.  
  1738.  
  1739.   /* gram */
  1740.   XtVaGetValues(gram, XtNstring, &wert, NULL);
  1741.   fprintf(fp, "%s\n", wert);
  1742.  
  1743.   if (fclose(fp))
  1744.   {
  1745.     fprintf(stderr, "Datei konnte nicht geschlossen werden\n");
  1746.     fprintf(stderr, "fclose in save_settings_to_file\n");
  1747.     exit(1);
  1748.   }
  1749. }
  1750.  
  1751. /*************************************************************************/
  1752. /*************************************************************************/
  1753. /*************************************************************************/
  1754. /* Function Name: 
  1755.  * Description: 
  1756.  * Arguments: 
  1757.  * Globals: 
  1758.  * Returns: 
  1759.  */
  1760.  
  1761. /*************************************************************************/
  1762.  
  1763.  
  1764.